﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
	//C语言已经提供了内置类型，如：char、short、int、long、float、double等，但是只有这些内置类型还是不够的
	//对付复杂对象来说只用这些内置类型是不够的
//结构体：
	//结构体的关键字：struct
	//结构体是用来描述一个复杂对象的，它里边可以包含多个属性

	//创建出一个新的类型
	//自定义的类型
    //struct Student
	//{
	//	char name[20]; //名字
	//	int age; //年龄
	//	float high; //身高
	//	float weight; //体重
	//	char id[16]; //学号
	//}; //一定要注意：创建出的结构体结尾后面要加分号
	//结构是一些值的集合，这些值称为“成员变量”。结构的每个成员可以是不同类型的变量，如：标量、数组、指针，甚至是其他结构体。

//	struct student
//	{
//		char name[20];
//		int age;
//		float high;
//		float weight;
//		char id[16];
//	}s4, s5, s6;
//	//s4, s5, s6也是结构体变量(全局变量)
//	struct student s7; //全局变量
//	int main() 
//	{
//		struct student s1 = { "张三", 20, 180.0f, 75.5f, "20230901022" }; //初始化
//		struct student s2 = { .age = 30, .weight = 80.5f, .id = "20220101033", .high = 177.5f, .name = "李四" };
//		//s1, s2, s3是三个结构体变量(局部变量)
//		printf("%s %d %.1f %.1f %s", s1.name, s1.age, s1.high, s1.weight, s1.id); //打印结构体
////结构成员访问操作符中的直接访问：结构体成员的直接访问是通过点操作符（.）访问的。使用方式：结构体变量.成员变量
//		return 0;
//	}

//struct S
//{
//	char c;
//	int n;
//};
//
//struct B
//{
//	struct S s;
//	int* p;
//	char arr[10];
//	float sc;
//};
//
//int main()
//{
//	struct B b = { {'w', 10}, NULL, 'hehe', 85.5f }; //结构体嵌套初始化
//	printf("%d\n", b.s.n); //结构体嵌套的打印
//	return 0;
//}

//表达式求值
//整型提升
	//C语言中整型算术运算总是至少以缺省（默认）整型类型的精度来进⾏的。
	//为了获得这个精度，表达式中的字符和短整型操作数在使用之前被转换为“普通整型”，这种转换称为整型提升。
//整型提升的意义：
	//表达式的整型运算要在CPU的相应运算器件内执行，CPU内整型运算器的操作数的字节长度⼀般就是int的字节长度，同时也是CPU的通用寄存器度。
	//因此，即使两个char类型的相加，在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
	//通用CPU是难以直接实现两个8⽐特字节直接相加运算（虽然机器指令中可能有这种字节相加指令）。
	//所以，表达式中各种长度可能⼩于int长度的整型值，都必须先转换为 int 或 unsigned int ，然后才能送入CPU去执行运算。
//如何进行整体提升：
    //1.有符号整数提升是按照变量的数据类型的“符号位”来提升的
    //2.无符号整数提升，⾼位直接补0

int main()
{
	char a = 3; //在这个vs2022的编译器中 char -- signed char
	//00000000000000000000000000000011 --> 3的补码
	//00000011 --> a真实存储的值(由于a的类型是 char ，大小为8个比特)
	char b = 127;
	//00000000000000000000000001111111 --> 127的补码
	//01111111 --> b真实存储的值(由于b的类型是 char ，大小为8个比特)
	char c = a + b;
	//整型提升：
	// --> 将a真实存储的值提升为普通整型
	//00000000000000000000000001111111 --> 将b真实存储的值提升为普通整型
	//00000000000000000000000010000010 --> a + b 整型提升后赋给c的值
	//10000010 --> c真实存储的值(由于c的类型是 char ，大小为8个比特)
	printf("%d\n", c); //-126
	//由于%d是以十进制的形式打印有符号的整数，
	//而c的类型是 signed char 类型，所以在打印时c也发生了整型提升：
	//又因为c是有符号的字符类型。则最高位为符号位，在整型提升时是按照变量的数据类型的“符号位”来提升的
	//1111111111111111111111110000010 --> c整型提升后的值(相当于转换成了 int 类型)
	//由之前所学知识可知这是补码，则c打印时以原码形式打印：10000000000000000000000001111110 --> c整型提升后的原码(-126)
	return 0;
}

